package com.etime.shyauth.services.impl;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.etime.shyauth.dao.SysUserMapper;
import com.etime.shyauth.dto.PassDto;
import com.etime.shyauth.pojo.SysUser;
import com.etime.shyauth.services.interfaces.SysUserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.DigestUtils;

import java.util.Date;
import java.util.List;

/**
 * 用户管理service层实现类
 */
@Service
public class SysUserServiceImpl implements SysUserService {

    @Autowired
    private SysUserMapper mapper;

    /**
     * 增加用户
     *
     * @param user 用户实体
     * @return 0失败；1成功
     */
    @Override
    public int insertSysUser(SysUser user) {
        //对保存到数据库中的用户密码进行加密
        //使用两次MD5加密
        if (user != null && user.getUserpwd() != null) {
            user.setUserpwd(DigestUtils.md5DigestAsHex(DigestUtils.md5DigestAsHex(user.getUserpwd().getBytes()).getBytes()));
        }
        user.setCreatetime(new Date());
        int rtn = mapper.insert(user);
        System.out.println(user);
        return rtn;
    }

    /**
     * 修改用户
     *
     * @param user 用户实体
     * @return 0失败；1成功
     */
    @Override
    public int updateSysUser(SysUser user) {
        if (user != null && user.getUserpwd() != null) {
            user.setUserpwd(DigestUtils.md5DigestAsHex(DigestUtils.md5DigestAsHex(user.getUserpwd().getBytes()).getBytes()));
        }
        return mapper.updateById(user);
    }

    /**
     * 修改用户的unionid
     *
     * @param user
     * @return
     */
    @Override
    public int updateSysUserUnionId(SysUser user) {
        return mapper.updateUserUnionId(user);
    }

    /**
     * 修改用户指定字段；用于小程序端修改用户个人信息
     *
     * @param user
     * @return
     */
    @Override
    public int updateBaseSysUser(SysUser user) {
        return mapper.updateBaseSysUser(user);
    }

    /**
     * 根据条件查询用户列表
     *
     * @param user 查询条件:username,userstate,userphone,isteacher,issaler,unionid,openid
     * @return 用户列表
     */
    @Override
    public List<SysUser> selectUserList(SysUser user) {
        QueryWrapper<SysUser> wrapper = new QueryWrapper<>();
        if (user != null) {
            if (user.getIssaler() != null && user.getIssaler() != -1) {
                wrapper.eq("issaler", user.getIssaler());
            }
            if (user.getIsteacher() != null && user.getIsteacher() != -1) {
                wrapper.eq("isteacher", user.getIsteacher());
            }
            if (user.getUserstate() != null && user.getUserstate() != -1) {
                wrapper.eq("userstate", user.getUserstate());
            }
            if (user.getUsername() != null && !user.getUsername().equals("")) {
                wrapper.eq("username", user.getUsername());
            }
            if (user.getUserphone() != null && !user.getUserphone().equals("")) {
                wrapper.eq("userphone", user.getUserphone());
            }
            if (user.getUnionid() != null && !user.getUnionid().equals("")) {
                wrapper.eq("unionid", user.getUnionid());
            }
            if (user.getOpenid() != null && !user.getOpenid().equals("")) {
                wrapper.eq("openid", user.getOpenid());
            }
        }
        return mapper.selectList(wrapper);
    }

    /**
     * 分页查询
     *
     * @param user     查询条件:username,userstate,userphone,isteacher,issaler
     * @param pagenum  页码
     * @param pagesize 每页多少行
     * @return 查询结果
     */
    @Override
    public Page<SysUser> selectUserByPage(SysUser user, Long pagenum, Long pagesize) {
        Page<SysUser> page = new Page<>(pagenum, pagesize);
        QueryWrapper<SysUser> wrapper = new QueryWrapper<>();
        if (user != null) {
            if (user.getIssaler() != null && user.getIssaler() != -1) {
                wrapper.eq("issaler", user.getIssaler());
            }
            if (user.getIsteacher() != null && user.getIsteacher() != -1) {
                wrapper.eq("isteacher", user.getIsteacher());
            }
            if (user.getUserstate() != null && user.getUserstate() != -1) {
                wrapper.eq("userstate", user.getUserstate());
            }
            if (user.getUsername() != null && !user.getUsername().equals("")) {
                wrapper.eq("username", user.getUsername());
            }
            if (user.getUserphone() != null && !user.getUserphone().equals("")) {
                wrapper.eq("userphone", user.getUserphone());
            }
            //    添加用户姓名 微信名称模糊查询
            if (user.getNickname() != null && !user.getNickname().equals("")) {
                wrapper.and(w -> w.like("nickname", user.getNickname()).or().like("usertruename", user.getNickname()));
            }
        }
        return mapper.selectPage(page, wrapper);
    }

    /**
     * 根据id查询一条用户详细信息
     *
     * @param userid 用户id
     * @return 用户实体
     */
    @Override
    public SysUser selectUserById(Integer userid) {
        return mapper.selectById(userid);
    }

    /**
     * 修改用戶 密码
     * 1、获取用户
     * 2、旧密码匹配密码
     * 3、加密
     * 4、修改用户
     *
     * @param dto
     * @return int 1 成功 ，0 失败，-1 旧密码匹配密码失败
     * @Author wb
     */
    @Override
    public int updateUserPass(PassDto dto) {
        if (dto != null) {
            // 获取用户 信息
            SysUser sysUser = mapper.selectById(dto.getUserid());
            String cPass = DigestUtils.md5DigestAsHex(DigestUtils.md5DigestAsHex(dto.getCurrentPass().getBytes()).getBytes());
            //旧密码匹配密码
            if (cPass.equals(sysUser.getUserpwd())) {
                // 旧密码相同 进行设置新密码
                sysUser.setUserpwd(DigestUtils.md5DigestAsHex(DigestUtils.md5DigestAsHex(dto.getPassword().getBytes()).getBytes()));
                return mapper.updateById(sysUser);
            } else {
                //旧密码匹配密码失败 返回 -1
                return -1;
            }
        }
        return 0;
    }

    /**
     * 修改用户的从属销售人员id
     *
     * @param user
     * @return
     */
    @Override
    public int updateSysSaleUserId(SysUser user) {
        return mapper.updateSysSaleUserId(user);
    }
}
